home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / The Hacks / OutOfContextMenus / Source / CShadowWindow.cp < prev    next >
Encoding:
Text File  |  1999-06-25  |  5.1 KB  |  237 lines  |  [TEXT/CWIE]

  1. // ===========================================================================
  2. //    CShadowWindow.cp                 ©1999 Eric Traut
  3. // ===========================================================================
  4.  
  5. #include "CShadowWindow.h"
  6. #include "CBlurBehavior.h"
  7. #include "CInvertBehavior.h"
  8. #include "CDuplicateBehavior.h"
  9. #include "CCrashedBehavior.h"
  10. #include "CPigLatinBehavior.h"
  11. #include "CFlipBehavior.h"
  12. #include "CVBlankBehavior.h"
  13. #include "CNewCardBehavior.h"
  14. #include "CRebootBehavior.h"
  15. #include "CPongGameBehavior.h"
  16.  
  17.  
  18. // ---------------------------------------------------------------------------
  19. //        • CShadowWindow
  20. // ---------------------------------------------------------------------------
  21.  
  22. CShadowWindow::CShadowWindow(
  23.     CWindowRecord *        inWindowPtr)
  24. {
  25.     mWindowPtr = inWindowPtr;
  26.     mNeedsUpdate = false;
  27.     mWindowBehavior = NULL;
  28.     mIdleAction = kShadowActionNone;
  29. }
  30.  
  31.  
  32. // ---------------------------------------------------------------------------
  33. //        • ~CShadowWindow
  34. // ---------------------------------------------------------------------------
  35.  
  36. CShadowWindow::~CShadowWindow(void)
  37. {
  38.     DeleteBehavior();
  39. }
  40.  
  41.  
  42. // ---------------------------------------------------------------------------
  43. //        • AttachBehavior
  44. // ---------------------------------------------------------------------------
  45.  
  46. void
  47. CShadowWindow::AttachBehavior(
  48.     CWindowBehavior &        inBehavior)
  49. {
  50.     // Delete any existing behaviors
  51.     DetachBehavior();
  52.  
  53.     mWindowBehavior = &inBehavior;
  54. }
  55.  
  56.  
  57. // ---------------------------------------------------------------------------
  58. //        • DetachBehavior
  59. // ---------------------------------------------------------------------------
  60.  
  61. void
  62. CShadowWindow::DetachBehavior(void)
  63. {
  64.     if (HasBehavior())
  65.     {
  66.         GetBehavior()->DetachBehavior();
  67.         DeleteBehavior();
  68.     }
  69. }
  70.  
  71.  
  72. // ---------------------------------------------------------------------------
  73. //        • DeleteBehavior
  74. // ---------------------------------------------------------------------------
  75.  
  76. void
  77. CShadowWindow::DeleteBehavior(void)
  78. {
  79.     delete mWindowBehavior;
  80.     mWindowBehavior = NULL;
  81. }
  82.  
  83.  
  84. // ---------------------------------------------------------------------------
  85. //        • HandleEvent
  86. // ---------------------------------------------------------------------------
  87.  
  88. void
  89. CShadowWindow::HandleEvent(
  90.     EventRecord *        ioEvent, 
  91.     Boolean *            ioResult)
  92. {
  93.     if (HasBehavior())
  94.         mWindowBehavior->HandleEvent(ioEvent, ioResult);
  95. }
  96.  
  97.  
  98. // ---------------------------------------------------------------------------
  99. //        • DoIdleTask
  100. // ---------------------------------------------------------------------------
  101.  
  102. void
  103. CShadowWindow::DoIdleTask(
  104.     Boolean        inGNETime)
  105. {
  106.     if (mIdleAction != kShadowActionNone)
  107.     {
  108.         switch (mIdleAction)
  109.         {
  110.             case kShadowActionBlur:
  111.                 new CBlurBehavior(*this);
  112.                 break;
  113.             
  114.             case kShadowActionFlipH:
  115.                 new CFlipBehavior(*this, true);
  116.                 break;
  117.  
  118.             case kShadowActionFlipV:
  119.                 new CFlipBehavior(*this, false);
  120.                 break;
  121.             
  122.             case kShadowActionInvert:
  123.                 new CInvertBehavior(*this);
  124.                 break;
  125.             
  126.             case kShadowActionDuplicate:
  127.                 new CDuplicateBehavior(*this);
  128.                 break;
  129.             
  130.             case kShadowActionVBlank:
  131.                 new CVBlankBehavior(*this);
  132.                 break;
  133.             
  134.             case kShadowActionNextSlide:
  135.                 new CNewCardBehavior(*this);
  136.                 break;
  137.             
  138.             case kShadowActionRestore:
  139.                 DetachBehavior();
  140.                 break;
  141.             
  142.             case kShadowActionGame:
  143.                 new CPongGameBehavior(*this);
  144.                 break;
  145.             
  146.             case kShadowActionReboot:
  147.                 new CRebootBehavior(*this);
  148.                 break;
  149.             
  150.             case kShadowActionCrash:
  151.                 new CCrashedBehavior(*this);
  152.                 break;
  153.  
  154.             case kShadowActionPigLatin:
  155.                 new CPigLatinBehavior(*this);
  156.                 break;
  157.             
  158.             default:
  159.                 SignalPStr_("\pUnknown shadow action");
  160.                 break;
  161.         }
  162.         
  163.         mIdleAction = kShadowActionNone;
  164.     }
  165.     else
  166.     {
  167.         if (HasBehavior())
  168.         {
  169.             Rect        entirePort = {-0x4000, -0x4000, 0x4000, 0x4000};
  170.             
  171.             if (mWindowBehavior->SyncWithShadowWindow())
  172.             {
  173.                 if (inGNETime && mNeedsUpdate)
  174.                 {
  175.                     ::SetPort(reinterpret_cast<GrafPtr>(mWindowPtr));
  176.                     ::InvalRect(&entirePort);
  177.                     mNeedsUpdate = false;
  178.                 }
  179.                 
  180.                 UseWindowsPort();
  181.                 mWindowBehavior->DoIdleTask(inGNETime);
  182.             }
  183.             else if (inGNETime)
  184.             {
  185.                 ::SetPort(reinterpret_cast<GrafPtr>(mWindowPtr));
  186.                 ::InvalRect(&entirePort);
  187.                 mNeedsUpdate = false;
  188.             }
  189.             else
  190.             {
  191.                 mNeedsUpdate = true;
  192.             }
  193.         }
  194.     }
  195. }
  196.  
  197.  
  198. // ---------------------------------------------------------------------------
  199. //        • GetWindowTitle
  200. // ---------------------------------------------------------------------------
  201.  
  202. void
  203. CShadowWindow::GetWindowTitle(
  204.     Str255         outName)
  205. {
  206.     ::GetWTitle(reinterpret_cast<WindowPtr>(mWindowPtr), outName);
  207. }
  208.  
  209.  
  210. // ---------------------------------------------------------------------------
  211. //        • UseWindowPort
  212. // ---------------------------------------------------------------------------
  213.  
  214. void
  215. CShadowWindow::UseWindowsPort(void)
  216. {
  217.     ::SetPort(reinterpret_cast<WindowPtr>(mWindowPtr));
  218. }
  219.  
  220.  
  221. // ---------------------------------------------------------------------------
  222. //        • ShouldEnableRestoreMenu
  223. // ---------------------------------------------------------------------------
  224.  
  225. Boolean
  226. CShadowWindow::ShouldEnableRestoreMenu(void)
  227. {
  228.     if (!HasBehavior())
  229.         return false;
  230.     
  231.     return mWindowBehavior->ShouldEnableRestoreMenu();
  232. }
  233.  
  234.  
  235.  
  236.  
  237.